{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 图数据的导入和预处理\n",
    "\n",
    "In this session, you will learn:\n",
    "\n",
    "* Load graph data stored in CSV files.\n",
    "* Construct a graph in DGL.\n",
    "* Query structural information of a DGL graph.\n",
    "* Load and pre-process node and edge features.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from tutorial_utils import setup_tf\n",
    "setup_tf()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 从CSV文件里导入图数据"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Comma Separated Values (CSV) is a widely-used format for storing relational data. In this tutorial, we have prepared two CSV files that store [the Zachery's Karate Club network](https://en.wikipedia.org/wiki/Zachary%27s_karate_club).\n",
    "* The `nodes.csv` stores every club members and their attributes.\n",
    "* The `edges.csv` stores the pair-wise interactions between two club members."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "total 24\r\n",
      "-rw-r--r--  1 jamezhan  1896053708   3.7K May  8 14:02 edges.csv\r\n",
      "-rw-r--r--  1 jamezhan  1896053708   1.2K May  8 14:02 gen_data.py\r\n",
      "-rw-r--r--  1 jamezhan  1896053708   461B May  8 14:02 nodes.csv\r\n"
     ]
    }
   ],
   "source": [
    "!ls -lh 'data'"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can use `pandas` to load the two CSV files."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "    Id     Club  Age\n",
      "0    0   Mr. Hi   45\n",
      "1    1   Mr. Hi   33\n",
      "2    2   Mr. Hi   36\n",
      "3    3   Mr. Hi   31\n",
      "4    4   Mr. Hi   41\n",
      "5    5   Mr. Hi   42\n",
      "6    6   Mr. Hi   48\n",
      "7    7   Mr. Hi   41\n",
      "8    8   Mr. Hi   30\n",
      "9    9  Officer   35\n",
      "10  10   Mr. Hi   38\n",
      "11  11   Mr. Hi   44\n",
      "12  12   Mr. Hi   37\n",
      "13  13   Mr. Hi   39\n",
      "14  14  Officer   36\n",
      "15  15  Officer   38\n",
      "16  16   Mr. Hi   47\n",
      "17  17   Mr. Hi   45\n",
      "18  18  Officer   41\n",
      "19  19   Mr. Hi   31\n",
      "20  20  Officer   31\n",
      "21  21   Mr. Hi   44\n",
      "22  22  Officer   42\n",
      "23  23  Officer   32\n",
      "24  24  Officer   30\n",
      "25  25  Officer   50\n",
      "26  26  Officer   30\n",
      "27  27  Officer   43\n",
      "28  28  Officer   48\n",
      "29  29  Officer   40\n",
      "30  30  Officer   39\n",
      "31  31  Officer   45\n",
      "32  32  Officer   47\n",
      "33  33  Officer   33\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "\n",
    "nodes_data = pd.read_csv('data/nodes.csv')\n",
    "print(nodes_data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "     Src  Dst    Weight\n",
      "0      0    1  0.318451\n",
      "1      0    2  0.551215\n",
      "2      0    3  0.227416\n",
      "3      0    4  0.266919\n",
      "4      0    5  0.475449\n",
      "..   ...  ...       ...\n",
      "151   33   28  0.266479\n",
      "152   33   29  0.279901\n",
      "153   33   30  0.652154\n",
      "154   33   31  0.828536\n",
      "155   33   32  0.842656\n",
      "\n",
      "[156 rows x 3 columns]\n"
     ]
    }
   ],
   "source": [
    "edges_data = pd.read_csv('data/edges.csv')\n",
    "print(edges_data)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We then construct a graph where each node is a club member and each edge represents their interactions. In DGL, **nodes are consecutive integers starting from zero**. Thus, when preparing the data, it is important to re-label or re-shuffle the row order so that the first row corresponding to the first nodes, so on and so forth.\n",
    "\n",
    "In this example, we have already prepared the data in the correct order, so we can create the graph by the `'Src'` and `'Dst'` columns from the `edges.csv` table."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Graph(num_nodes=34, num_edges=156,\n",
      "      ndata_schemes={}\n",
      "      edata_schemes={})\n"
     ]
    }
   ],
   "source": [
    "import dgl\n",
    "\n",
    "src = edges_data['Src'].to_numpy()\n",
    "dst = edges_data['Dst'].to_numpy()\n",
    "\n",
    "# Create a DGL graph from a pair of numpy arrays\n",
    "g = dgl.graph((src, dst))\n",
    "\n",
    "# Print a graph gives some meta information such as number of nodes and edges.\n",
    "print(g)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "A DGL graph can be converted to a `networkx` graph, so to utilize its rich functionalities such as visualization."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import networkx as nx\n",
    "# Since the actual graph is undirected, we convert it for visualization\n",
    "# purpose.\n",
    "nx_g = g.to_networkx().to_undirected()\n",
    "# Kamada-Kawaii layout usually looks pretty for arbitrary graphs\n",
    "pos = nx.kamada_kawai_layout(nx_g)\n",
    "nx.draw(nx_g, pos, with_labels=True, node_color=[[.7, .7, .7]])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 查询图的结构信息"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's print out how many nodes and edges are there in this graph."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "#Nodes 34\n",
      "#Edges 156\n"
     ]
    }
   ],
   "source": [
    "print('#Nodes:', g.number_of_nodes())\n",
    "print('#Edges:', g.number_of_edges())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can also perform queries on the graph structures."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Get the in-degree of node 0:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "16"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g.in_degree(0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Get the successors of node 0:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<tf.Tensor: shape=(16,), dtype=int64, numpy=array([ 1,  2,  3,  4,  5,  6,  7,  8, 10, 11, 12, 13, 17, 19, 21, 31])>"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g.successors(0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "DGL provides APIs for querying structural information. See the API document [here](https://docs.dgl.ai/api/python/heterograph.html#querying-graph-structure)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![image.png](../asset/dgl-query.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 导入节点和边的特征数据"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In many graph data, nodes and edges have attributes. Although these attributes can have arbitrary types, a DGL graph only accepts attributes stored in tensors (with numerical contents). The vast development of deep learning has provided us many ways to vectorize various types of attributes into numerical features. Here are some general suggestions:\n",
    "* For categorical attributes (e.g. gender, occupation), consider converting them to integers or one-hot encoding.\n",
    "* For variable length string contents (e.g. news article, quote), consider applying a language model.\n",
    "* For images, consider applying a vision model such as CNNs.\n",
    "\n",
    "Our data set has the following attribute columns:\n",
    "* `Age` is already an integer attribute.\n",
    "* `Club` is a categorical attribute representing which community each member belongs to.\n",
    "* `Weight` is a floating number indicating the strength of each interaction."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tf.Tensor(\n",
      "[0.45 0.33 0.36 0.31 0.41 0.42 0.48 0.41 0.3  0.35 0.38 0.44 0.37 0.39\n",
      " 0.36 0.38 0.47 0.45 0.41 0.31 0.31 0.44 0.42 0.32 0.3  0.5  0.3  0.43\n",
      " 0.48 0.4  0.39 0.45 0.47 0.33], shape=(34,), dtype=float32)\n"
     ]
    }
   ],
   "source": [
    "import tensorflow as tf\n",
    "import numpy as np\n",
    "\n",
    "# Prepare the age node feature\n",
    "age = tf.constant(nodes_data['Age'].to_numpy(), dtype=tf.float32) / 100\n",
    "print(age)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<tf.Tensor: shape=(2,), dtype=float32, numpy=array([0.45, 0.38], dtype=float32)>"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Get the features of node 0 and 10\n",
    "tf.gather(age, [0, 10])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Use `g.ndata` to set the age features to the graph."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Graph(num_nodes=34, num_edges=156,\n",
      "      ndata_schemes={'age': Scheme(shape=(), dtype=tf.float32)}\n",
      "      edata_schemes={})\n"
     ]
    }
   ],
   "source": [
    "# Feed the features to graph\n",
    "g.ndata['age'] = age\n",
    "print(g)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tf.Tensor(\n",
      "[[1. 0.]\n",
      " [1. 0.]\n",
      " [1. 0.]\n",
      " [1. 0.]\n",
      " [1. 0.]\n",
      " [1. 0.]\n",
      " [1. 0.]\n",
      " [1. 0.]\n",
      " [1. 0.]\n",
      " [0. 1.]\n",
      " [1. 0.]\n",
      " [1. 0.]\n",
      " [1. 0.]\n",
      " [1. 0.]\n",
      " [0. 1.]\n",
      " [0. 1.]\n",
      " [1. 0.]\n",
      " [1. 0.]\n",
      " [0. 1.]\n",
      " [1. 0.]\n",
      " [0. 1.]\n",
      " [1. 0.]\n",
      " [0. 1.]\n",
      " [0. 1.]\n",
      " [0. 1.]\n",
      " [0. 1.]\n",
      " [0. 1.]\n",
      " [0. 1.]\n",
      " [0. 1.]\n",
      " [0. 1.]\n",
      " [0. 1.]\n",
      " [0. 1.]\n",
      " [0. 1.]\n",
      " [0. 1.]], shape=(34, 2), dtype=float32)\n",
      "Graph(num_nodes=34, num_edges=156,\n",
      "      ndata_schemes={'club': Scheme(shape=(), dtype=tf.int64), 'club_onehot': Scheme(shape=(2,), dtype=tf.float32)}\n",
      "      edata_schemes={})\n"
     ]
    }
   ],
   "source": [
    "# The \"Club\" column represents which community does each node belong to.\n",
    "# The values are of string type, so we must convert it to either categorical\n",
    "# integer values or one-hot encoding.\n",
    "\n",
    "club = nodes_data['Club'].to_list()\n",
    "# Convert to categorical integer values with 0 for 'Mr. Hi', 1 for 'Officer'.\n",
    "club = tf.constant([c == 'Officer' for c in club], dtype=tf.int64)\n",
    "# We can also convert it to one-hot encoding.\n",
    "club_onehot = tf.one_hot(club, np.max(club)+1)\n",
    "print(club_onehot)\n",
    "\n",
    "# Use `g.ndata` like a normal dictionary\n",
    "g.ndata.update({'club' : club, 'club_onehot' : club_onehot})\n",
    "# Remove some features using del\n",
    "del g.ndata['age']\n",
    "\n",
    "print(g)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Feeding edge features to a DGL graph is similar."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Graph(num_nodes=34, num_edges=156,\n",
      "      ndata_schemes={'club': Scheme(shape=(), dtype=tf.int64), 'club_onehot': Scheme(shape=(2,), dtype=tf.float32)}\n",
      "      edata_schemes={'weight': Scheme(shape=(), dtype=tf.float64)})\n"
     ]
    }
   ],
   "source": [
    "# Get edge features from the DataFrame and feed it to graph.\n",
    "edge_weight = tf.constant(edges_data['Weight'].to_numpy())\n",
    "# Similarly, use `g.edata` for getting/setting edge features.\n",
    "g.edata['weight'] = edge_weight\n",
    "print(g)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python [conda env:dgl]",
   "language": "python",
   "name": "conda-env-dgl-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
